﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioEndereco : IRepositorioEndereco
    {
        public Endereco Inserir(Endereco endereco)
        {
            endereco.FimVigencia = endereco.FimVigencia.HasValue
                                    ? endereco.FimVigencia.GetValueOrDefault().Date
                                    : endereco.FimVigencia;
            endereco.InicioVigencia = endereco.InicioVigencia.HasValue
                                        ? endereco.InicioVigencia.GetValueOrDefault().Date
                                        : endereco.InicioVigencia;
            foreach (Telefone telefone in endereco.ListaTelefones)
            {
                telefone.Endereco = endereco;
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(endereco);
            return endereco;
        }

        public Endereco Atualizar(Endereco endereco)
        {
            Endereco tmpEndereco = ObterPorId(endereco.EnderecoId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpEndereco.CaixaPostal = endereco.CaixaPostal;
            tmpEndereco.Codigo = endereco.Codigo;
            tmpEndereco.Complemento = endereco.Complemento;
            tmpEndereco.EnumTipoResidencia = endereco.EnumTipoResidencia;
            tmpEndereco.FimVigencia = endereco.FimVigencia.HasValue
                                    ? endereco.FimVigencia.GetValueOrDefault().Date
                                    : endereco.FimVigencia;
            tmpEndereco.InicioVigencia = endereco.InicioVigencia.HasValue
                                        ? endereco.InicioVigencia.GetValueOrDefault().Date
                                        : endereco.InicioVigencia;
            tmpEndereco.FlagCobranca = endereco.FlagCobranca;
            tmpEndereco.FlagCorrespondencia = endereco.FlagCorrespondencia;
            tmpEndereco.FlagFaturamento = endereco.FlagFaturamento;
            tmpEndereco.FlagPublicacao = endereco.FlagPublicacao;
            tmpEndereco.HoraFinal = endereco.HoraFinal;
            tmpEndereco.HoraInicial = endereco.HoraInicial;
            tmpEndereco.Logradouro = endereco.Logradouro;
            tmpEndereco.NeturionLog = endereco.NeturionLog;
            tmpEndereco.Numero = endereco.Numero;
            tmpEndereco.Observacao = endereco.Observacao;
            tmpEndereco.Pessoa = endereco.Pessoa;
            
            tmpEndereco.ListaTelefones.Clear();
            foreach (Telefone telefone in endereco.ListaTelefones)
            {
                tmpEndereco.AdicionarTelefone(telefone);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpEndereco);
            return tmpEndereco;
        }

        public void Excluir(Endereco endereco)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(endereco);
        }

        public IList<Endereco> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Endereco));
            return criteria.List<Endereco>() as List<Endereco>;
        }

        public Endereco ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Endereco>(id);
        }

        public Endereco ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Endereco))
                .Add(Restrictions.Eq("Codigo",codigo));
            return criteria.UniqueResult<Endereco>();
        }

        public IList<Endereco> ObterPorPessoa(Pessoa pessoa)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Endereco))
                .Add(Restrictions.Eq("Pessoa",pessoa));
            return criteria.List<Endereco>() as List<Endereco>;
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Endereco)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("EnderecoId"));


            Endereco endereco = criteria.UniqueResult<Endereco>();
            int ultimoCodigo = endereco != null ? endereco.EnderecoId : 0;

            return ultimoCodigo;
        }
    }
}